Vanilla JavaScript와 JQuery로 HTML 템플릿 문서 가져와서 사용하기

✒️ 2025-05-23 15:33 내용 수정



1. 템플릿화 할 HTML 문서 생성하기

a. JQuery 사용 시

<!-- videoContent.html -->
<div id="content-template">
    <div class="content">
        <div class="thumbnail-box">
            <img id="thumbnail-img" class="thumbnail-img" src="" alt="썸네일 이미지">
        </div>
        <div class="meta-info">
            <h3 id="video-title" class="video-title">제목</h3>
            <div class="channel-info">
                <span id="channel-name" class="channel-name">채널명</span>
            </div>
            <div class="video-stats">
                <span id="spectator-number" class="spectator-number">조회수</span>
                <span class="separator">•</span>
                <span id="upload-time" class="upload-time">업로드 시간</span>
            </div>
        </div>
    </div>
</div>

b. vanilla Javascript 사용 시

<!-- videoContent.html -->
<template id="content-template">
    <div class="content">
        <div class="thumbnail-box">
            <img id="thumbnail-img" class="thumbnail-img" src="" alt="썸네일 이미지">
        </div>
        <div class="meta-info">
            <h3 id="video-title" class="video-title">제목</h3>
            <div class="channel-info">
                <span id="channel-name" class="channel-name">채널명</span>
            </div>
            <div class="video-stats">
                <span id="spectator-number" class="spectator-number">조회수</span>
                <span class="separator">•</span>
                <span id="upload-time" class="upload-time">업로드 시간</span>
            </div>
        </div>
    </div>
</template>

template_tag.png


2. HTML 템플릿 문서를 넣을 대상 HTML 파일에 JS 설정하기

<!-- index.html -->
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Template Example</title>
    <script src="<https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js>"></script>
</head>
<body>
    <div id="contents"></div>
    <script src="js/loadTemplate.js"></script>
</body>
</html>

3. JS에서 HTML 문서 수정하기

a. JQuery 사용 시

// 데이터
const info = [
    {title: '현재 재생목록에 추가', img_name: ''},
    {title: '나중에 볼 동영상에 저장', img_name: ''},
    {title: '재생목록에 저장', img_name: ''},
    {title: '오프라인 저장', img_name: ''},
    {title: '공유', img_name: ''},
    {title: '관심 없음', img_name: ''},
    {title: '채널 추천 안함', img_name: ''},
    {title: '신고', img_name: ''},
];

// 템플릿 html을 임시로 담을 div
const temp_div = document.createElement("div");

// JQuery로 문서 가져오기 - 바닐라 ajax로도 대체 가능
$.get("./homeComponents/html/videoContent.html", function(data) {
    // 문자열로 로드된 HTML을 DOM으로 파싱
    temp_div.innerHTML = data;

    // 템플릿 (div)
    const template = temp_div.querySelector("#template");
    // 타겟 태그
    const target = document.querySelector("#target");

		// 데이터를 순회하여 편집한 HTML을 타겟 태그에 담기
    info.forEach(el => {
        // 템플릿 내용 복제
        const clone = template.cloneNode(true);

        // 요소 수정
        clone.querySelector("#thumbnail-img").src = el.thumbnail;
        clone.querySelector("#video-title").textContent = el.title;
        clone.querySelector("#channel-name").textContent = el.uploader;
        clone.querySelector("#spectator-number").textContent = `조회수 ${el.spectators}`;
        clone.querySelector("#upload-time").textContent = el.uploaded_time;

        // 추가
        contents.appendChild(clone);
    })
});

b. fetch() 를 사용해서 불러오기

const temp_div = document.createElement("div");

fetch("./homeComponents/html/videoContent.html")
.then(res => {
    if (!res.ok) {
        throw new Error("HTML template 불러오기 실패");
    }
    return res.text();
})
.then(data => {
    // 문자열로 로드된 HTML을 DOM으로 파싱
    temp_div.innerHTML = data;

    // 템플릿 태그
    const template = temp_div.querySelector("#content-template").content;
    const contents = document.querySelector("#contents");

    video_info.forEach(el => {
        // 템플릿 내용 복제
        const clone = template.cloneNode(true);

        // 요소 수정
        clone.querySelector("#thumbnail-img").src = el.thumbnail;
        clone.querySelector("#video-title").textContent = el.title;
        clone.querySelector("#channel-name").textContent = el.uploader;
        clone.querySelector("#spectator-number").textContent = `조회수 ${el.spectators}`;
        clone.querySelector("#upload-time").textContent = el.uploaded_time;

        // 추가
        contents.appendChild(clone);
    })
})

template_html.png


웹 브라우저에서 HTML 템플릿 문서 접근 문제

main_component_expose 1.PNG.png

main_component_expose 2.PNG.png